iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0

倒數 7 天了,日子過得好快。轉眼間就快要完賽了。

那我們繼續往下看吧。

下標

他在 Class, Struct, Enum 裡都是訪問集合、列表、或序列中元素的快捷方式。
就像是你在 Array 實例中可以寫成 someArray[index] ,又或者在 Dictionary 實例中 可以寫成 someDictionary[key] 。

下標語法

可以允許你通過實力名稱後面的方誇號中傳入一個或者多個索引值來對實例進行查詢。
要使用的話要在前面加上 subscript 這個關鍵字,跟實例方法類似,都是指定一個或者多個參數然後再返回一個類型。但差別在於,下標可以設定讀寫或者讀。這種行為就或由 getter 和 setter 來達成。

subscript(index: Int) -> Int {
    get {
      // 返回Int
    }
    set(newValue) {
      // 執行賦值操作
    }
}

如果只是想讀取而且,可以省略 get 變成像下面這樣

subscript(index: Int) -> Int {
    // 返回Int
}

官方有一個乘法的例子。

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// 18

這邊他先給 multiplier 賦予一個 3 的參數
在輸出的那邊給了下標的 6 那他就是 subscript 的 index 參數。
所以才可以得到 18

下標用法

下標通常用來作為訪問使用。你也可以依照自己所需來對 Class 或者 Struct 的功能來使用下標。
官方這邊有一個對於 Dictionary 賦予跟他同類型的下標。

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

下標選項

下標可以接受多個輸入參數,而且參數可以是任何類型的,而下標也可以返回任何類型。下標類型可以使用可變參數但是不能使用輸入輸出參數或者提供默認的數值。

這邊我拿我們老大哥 Jeremy 的例子來看比較明白。

enum math{
    case add, sub, mul, div
}

class Computer {
    var result = 0
    
    func calculate(Number1 a:Int ,Number2 b:Int , method:math) -> Int {
        switch method {
        case .add:
            result = a + b
        case .sub:
            result = a - b
        case .mul:
            result = a * b
        case .div:
            result = a / b
        }
        return result
    }
    // 下標
    subscript(Number1 a:Int ,Number2 b:Int , method:math) -> Int {
        result  = calculate(Number1: a, Number2: b, method: method)
        return result
    }
}

他先用了 enum 來新增四個方法成員
然後在 class 裡面,做了一個函數,帶了三個參數,前兩個是 Int 最後一個是前面 enum 的方法成員。
之後賦值到實例中就會像下面

let math = Computer()
print(\math[Number1 a:3 ,Number2 b:5 , method:math.mul])
// 15

今天就到這裡拉,感謝各位。


上一篇
30天的 iOS 修仙道路 (22)
下一篇
30天的 iOS 修仙道路 (24)
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言